/******************************************
 **********   严格的身份证校验   ***************
 ******************************************/
import TypeMsg from './typeMsg';
import { CARD_CITY as cardCity } from './config';

const CARD_ERROR_FORMAT = '你输入的身份证长度或格式错误';
const CARD_ERROR_ADDRESS = '你的身份证地区非法';
const CARD_ERROR_DATE = '身份证上的出生日期非法';
const CARD_ERROR_CODE = '你输入的身份证号非法';
const CARD_SUCCESS_TIPS = '您输入的身份证号正确';

/**
 * 身份证格式严格校验
 * @param {*} sId   身份证号码
 * @returns  {Object}
 *      status: 0   ,   msg :  '您输入的身份证号正确'
 *      status: 1   ,   msg :  '你输入的身份证长度或格式错误'
 *      status: 2   ,   msg :  '你的身份证地区非法'
 *      status: 3   ,   msg :  '身份证上的出生日期非法'
 *      status: 4   ,   msg :  '你输入的身份证号非法'
 */
export const isCardID = (sId) => {
  if (!/(^\d{15}$)|(^\d{17}(\d|X|x)$)/.test(sId)) {
    return new TypeMsg(1, CARD_ERROR_FORMAT);
  }

  if (!cardCity[parseInt(sId.substr(0, 2))]) {
    return new TypeMsg(2, CARD_ERROR_ADDRESS);
  }

  // 出生日期验证
  var sBirthday = (
      sId.substr(6, 4) +
      '-' +
      Number(sId.substr(10, 2)) +
      '-' +
      Number(sId.substr(12, 2))
    ).replace(/-/g, '/'),
    d = new Date(sBirthday);
  if (
    sBirthday !=
    d.getFullYear() + '/' + (d.getMonth() + 1) + '/' + d.getDate()
  ) {
    return new TypeMsg(3, CARD_ERROR_DATE);
  }

  // 身份证号码校验
  var sum = 0,
    weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2],
    codes = '10X98765432';
  for (var i = 0; i < sId.length - 1; i++) {
    sum += sId[i] * weights[i];
  }
  var last = codes[sum % 11]; //计算出来的最后一位身份证号码
  if (sId[sId.length - 1] != last) {
    return new TypeMsg(4, CARD_ERROR_CODE);
  }

  return new TypeMsg(0, CARD_SUCCESS_TIPS);
};
